<?php 
header("Content-type: text/html; charset=utf-8");

require_once('auth_i.inc.php');

require_once('pdkparse.inc.php');

$show_info = "";


if (!empty($_FILES) && ($_FILES['file']['error'] == 0) && (is_uploaded_file($_FILES['file']['tmp_name'])))
{
	$info = parse_pdk_file($_FILES['file']['tmp_name']);
}

if (isset($_POST['action']))
{
	switch ($_POST['action'])
	{
		case '_add':

			if (!isset($info))
			{
				$show_info = 'Контроллер не добавлен:\nНеправильный или не задан файл программы.';
				break;
			}

			$sts = $dbh->prepare('select count(*) as count from network_map where c_id=:cid');
	    
	    		if ($sts->execute(array('cid' => $info['c_num'])))
	    		{
	        	    if ($res = $sts->fetchAll())
	        	    {
	    	    		if ($res[0]['count'] > 0)
	    	    		{
				    $show_info = 'Контроллер не добавлен:\nКонтроллер с номером:'. $info['c_num'] .' уже есть в сети.';
				    break;
	    	    		}
	    		    }    
	    		}

	  	  	$sth = $dbh->prepare('insert into network_map ' .
	  	  		'(c_id, g_id, location, enc_key, next_enc_key, program, prog_load_time, prog_update_status)'.
	  	  		' values (:cid, :gid, :location, :key, :key, :program, NOW(), 0)');

	  	  	$sth->bindParam(':cid',intval($info['c_num']), PDO::PARAM_INT);
			$sth->bindParam(':key',$info['key']);
			$sth->bindParam(':program',$info['program']);
			$sth->bindParam(':gid',intval($_POST['group']), PDO::PARAM_INT);
			$sth->bindParam(':location', $_POST['location']);

			if ($sth->execute())
			{
				$show_info = 'Добавлен контроллер номер: ' . $info['c_num'] . '\nКлюч: ' . $info['key'];
			}
			else
			{
				$err_arr = $sth->errorInfo();
				$show_info = 'Контроллер не добавлен:' . $err_arr[2];
			}

		break;
		
		case '_edit':

			if (!isset($info))
			{
  	  		    $sth = $dbh->prepare('update network_map set g_id=:gid, location=:location where c_id = :cid');

	  	  	    $sth->bindParam(':cid',intval($_POST['c_id']), PDO::PARAM_INT);
			    $sth->bindParam(':gid',intval($_POST['group']), PDO::PARAM_INT);
			    $sth->bindParam(':location', $_POST['location']);

			    if ($sth->execute())
			    {
				$show_info = '';
			    }
			    else
			    {
				$err_arr = $sth->errorInfo();
				$show_info = 'Ошибка при изменении контроллера:' . $err_arr[2];
			    }
			
			    break;
			}
			
			if ($info['c_num'] != $_POST['c_id'])
			{
			    $show_info = 'Контроллер не может быть отредактирован:\nНомер контроллера в программе '.$info['cnum'].'не соответсвует номеру контроллера: ' . $_POST['c_id'];
			    break;
			}

  	  		$sth = $dbh->prepare('update network_map set g_id=:gid, location=:location, next_enc_key=:key, '.
  	  					'program=:program, prog_update_status=0, prog_load_time=NOW() '.
  	  					'where c_id = :cid');

	  	  	$sth->bindParam(':cid',intval($info['c_num']), PDO::PARAM_INT);
			$sth->bindParam(':key',$info['key']);
			$sth->bindParam(':program',$info['program']);
			$sth->bindParam(':gid',intval($_POST['group']), PDO::PARAM_INT);
			$sth->bindParam(':location', $_POST['location']);

			if ($sth->execute())
			{
				$show_info = 'Контроллер номер: ' . $info['c_num'] . 'изменен! \nКлюч: ' . $info['key'];
			}
			else
			{
				$err_arr = $sth->errorInfo();
				$show_info = 'Ошибка при изменении контроллера:' . $err_arr[2];
			}

		break;

	}
}

?>

<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<meta http-equiv="X-UA-Compatible" content="IE=8" />
	<link rel="stylesheet" type="text/css" media="screen" href="css/themes/redmond/jquery-ui-1.8.9.custom.css" />
	<link rel="stylesheet" type="text/css" media="screen" href="css/ui.jqgrid.css" />
	<link rel="stylesheet" type="text/css" media="screen" href="css/ui.multiselect.css" />
	<link rel="stylesheet" type="text/css" media="screen" href="css/asud.css" />

	<script src="js/jquery-1.4.2.min.js" type="text/javascript"></script>
	<script src="js/i18n/grid.locale-ru.js" type="text/javascript"></script>
	<script src="js/jquery.jqGrid.min.js" type="text/javascript"></script>
	<script src="js/jquery-ui-1.8.9.custom.min.js" type="text/javascript"></script>

<script type="text/javascript">

function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
    var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
}

function lz(_val)
{
  return (parseInt(_val, 10) < 10) ? ( '0'+_val ) : _val;
}

function set_data(id)
{
		$.getJSON('req/con_rule.php?oper=info&cid='+id, 
				function (data)
				{

					$("[name=cont_id]").val(id);

					$('#next-key').html(data['next_enc_key'] );

					try
					{
						var date_load = mysqlTimeStampToDate(data['prog_load_time']);
						$('#load-date').html(lz(date_load.getDate())+'.'+lz(date_load.getMonth())+'.'+date_load.getFullYear()+' '+
											  lz(date_load.getHours())+':'+lz(date_load.getMinutes())+':'+lz(date_load.getSeconds()));
					}
					catch(e)
					{
						$('#load-date').html("");
					}

					try
					{
						var date_active = mysqlTimeStampToDate(data['prog_update_time']);
						$('#active-date').html(lz(date_active.getDate())+'.'+lz(date_active.getMonth())+'.'+date_active.getFullYear()+' '+
											  lz(date_active.getHours())+':'+lz(date_active.getMinutes())+':'+lz(date_active.getSeconds()));
					}
					catch(e)
					{
						$('#active-date').html("");
					}

					$('#cur-key').html(data['enc_key']);

					$('#prev-key').html(data['prev_enc_key']);

					if (data['prog_update_status'] == null)
					{
						$('#con-state').html('<span style="color:red">Неизвестное состояние !</span>');
					} 
					else if(data['prog_update_status'] == 0)
					{
						$('#con-state').html('Программа загружена в базу.');
					}
					else if(data['prog_update_status'] == 1)
					{
						$('#con-state').html('<span style="color:red">Программа загружается.</span>');
					}
					else if(data['prog_update_status'] == 3)
					{
						$('#con-state').html('Программа загружена в контроллер.');
					}
					else if(data['prog_update_status'] == 4)
					{
						$('#con-state').html('<span style="color:red">Не удалось загрузить программу !</span>');
					}
					else
					{
						$('#con-state').html('<span style="color:red">Неизвестное состояние !</span>');
					}

					$("#load-button").button({disabled: false});

					$("#set-phase-button").button({disabled: false});

					$("#set-prog-button").button({disabled: false});

					$("#set-time-button").button({disabled: false})

				}
		)
}


$(function() { 
  $("#list").jqGrid({
    url:'req/con_list.php',
    editurl: 'req/con_edit.php',
    datatype: 'json',
    mtype: 'GET',
    colNames:['Номер','Группа', 'Расположение'],
    colModel :[ 
      {name:'c_id', index:'c_id', width:50, align: 'right'}, 
      {name:'g_name', index:'g_name', editable: true, edittype: 'select', editoptions: {dataUrl:'req/grp_opt.php?type=opt'}}, 
      {name:'location', index:'c_location', width: 185, editable: true}, 
    ],
    sortname: 'c_id',
    sortorder: 'desc',
    viewrecords: true,

	onSelectRow: function(id)
	{ 
		var c_id = $("#list").getCell(id, 0); 
 		set_data(c_id);

    }
  });

$( "#set-phase" ).dialog({
			autoOpen: false,
			height: 120,
			width: 370,
			modal: true,
			resizable: false,

			buttons: {
				"Ok": function() 
				{
						$( this ).dialog( "close" );

						var param = $("[name=phase]").val();
						var c_id = $("[name=cont_id]").val(); 

						$.get('req/con_rule.php?oper=cmd&cid='+c_id+'&cmd=phase&param='+param,
						function(data)
						{
							if (data['error'] != null)
							{
								alert("Ошибка установки фазы: " + data['error']);
							}
							else
							{
								alert("Фаза установлена !");
							}
						}
						)

				},
				Cancel: function() {
					$( this ).dialog( "close" );
				}
			},
});

$( "#set-program" ).dialog({
			autoOpen: false,
			height: 120,
			width: 370,
			modal: true,
			resizable: false,

			buttons: {
				"Ok": function() 
				{
						$( this ).dialog( "close" );

						var param = $("[name=program]").val();
						var c_id = $("[name=cont_id]").val(); 

						$.get('req/con_rule.php?oper=cmd&cid='+c_id+'&cmd=sprog&param='+param,
						function(data)
						{
							if (data['error'] != null)
							{
								alert("Ошибка установки программу: " + data['error']);
							}
							else
							{
								alert("Программа установлена !");
							}
						}
						)

				},
				Cancel: function() {
					$( this ).dialog( "close" );
				}
			},
});


$( "#add-form" ).dialog({
			autoOpen: false,
			height: 170,
			width: 370,
			modal: true,
			resizable: false,

			open: function (event, ui)
			{
				$('#group').load('req/grp_opt.php?type=opt', 
					function (data)
					{
						$('#group').html(data);
					}
				
				);	
			},
			buttons: {
				"Ok": function() {
					var bValid = true;

					$('#post-form').submit();

				},
				Cancel: function() {
					$( this ).dialog( "close" );
				}
			},
	});

$( "#add-button" )
			.button()
			.click(function() {
				$("[name=action]").val('_add');
				$("[name=location]").val('');	

				$( "#add-form" ).dialog("open");
			});

$( "#edit-button" )
			.button()
			.click(function() 
			{
				var gr = jQuery("#list").jqGrid('getGridParam','selrow'); 

				if( gr != null ) 
				{
					jQuery("#list").jqGrid('GridToForm',gr,'#add-form'); 
					$("[name=action]").val('_edit');

					$("#add-form" ).dialog({title:"Изменить параметры"});
					$("#add-form" ).dialog("open");
				}
				else 
					alert("Выберите строку для редактирования !"); 
			});

$( "#remove-button" )
			.button()
			.click(function() {
				var gr = $("#list").jqGrid('getGridParam','selrow'); 
				if( gr != null ) 
				{
					$("#list").jqGrid('delGridRow',gr,{reloadAfterSubmit:true}); 
				}
				else 
				{
					alert("Выбирете строку для удаления !"); 
				}

			});

$("#load-button")
			.button({disabled: true})
			.click(function() {

				var c_id = $("[name=cont_id]").val();; 

				if (c_id != null)
				{
					if (confirm("Загрузить программу в контроллер: "+c_id+" ?"))
					{
						$.get('req/con_rule.php?oper=cmd&cid='+c_id+'&cmd=pload',
						function(data)
						{
							if (data['error'] != null)
							{
								alert("Ошибка загрузки программы: " + data['error']);
							}
							else
							{
								alert("Загрузка программы стартовала !");
							}
						}
						)
					}
				}
			});

$("#set-phase-button")
			.button({disabled: true})
			.click(function() {
				$( "#set-phase" ).dialog("open");
			});

$("#set-prog-button")
			.button({disabled: true})
			.click(function() {
				$( "#set-program" ).dialog("open");
			});

$("#set-time-button")
			.button({disabled: true})
			.click(function() {
				var c_id = $("[name=cont_id]").val();; 

				if (c_id != null)
				{
					if (confirm("Синхронизировать с сервером время в контроллере: "+c_id+" ?"))
					{
						$.get('req/con_rule.php?oper=cmd&cid='+c_id+'&cmd=stime',
						function(data)
						{
							if (data['error'] != null)
							{
								alert("Ошибка синхронизации времени: " + data['error']);
							}
							else
							{
								alert("Сихронизация времени стартовала !");
							}
						}
						)
					}
				}

			});


<?php
	if (!empty($show_info))
	{
		echo 'alert("'. $show_info .'");'; 
	}
?>

setInterval(function()
{
	var c_id = $("[name=cont_id]").val();; 

	if (c_id != null)
	{
		set_data(c_id)	
	}
}, 10000)

}); 

</script>

</head>
<body>

<?php // menu bar
	require_once('menu.inc.php');

	print menu($menu_items, 'cmap.php');
?>

<div id="set-phase" title="Активировать фазу">
	<form id="set-phase-form" class="FormGrid">
		<table id = "FormTable">
		 <tr id="FormRow">
		  <td id="FormTD">
		    Выбирете фазу:
		  </td>
		  <td id="FormTD">	
		    <select name="phase" id="phase" size="1" class="FormElement ui-widget-content ui-corner-all">
		        <option value='0'>Отмена вызова фаз</option>
		    	<option value='1'>Фаза 1</option> 
	           	<option value='2'>Фаза 2</option> 
	            <option value='3'>Фаза 3</option> 
    	        <option value='4'>Фаза 4</option> 
	            <option value='5'>Фаза 5</option> 
        	    <option value='6'>Фаза 6</option> 
    	        <option value='7'>Фаза 7</option> 
        	    <option value='8'>Фаза 8</option> 
	            <option value='142'>Желтый мигающий</option> 
	            <option value='143'>Отключение сфетофоров</option> 
		    </select>
		  </td>
		 </tr>
		</table>
	</form>
</div>

<div id="set-program" title="Активировать программу">
	<form id="set-program-form" class="FormGrid">
		<table id = "FormTable">
		 <tr id="FormRow">
		  <td id="FormTD">
		    Выбирете программу:
		  </td>
		  <td id="FormTD">	
		    <select name="program" id="program" size="1" class="FormElement ui-widget-content ui-corner-all">
		    	<option value='1'>Программа 1</option> 
	           	<option value='2'>Программа 2</option> 
	            <option value='3'>Программа 3</option> 
    	        <option value='4'>Программа 4</option> 
	            <option value='5'>Программа 5</option> 
        	    <option value='6'>Программа 6</option> 
    	        <option value='7'>Программа 7</option> 
        	    <option value='8'>Программа 8</option> 
		    </select>
		  </td>
		 </tr>
		</table>
	</form>
</div>

<div id="add-form" title="Создать новый контроллер">
	<form id="post-form" enctype="multipart/form-data" action="cmap.php" method="post" class="FormGrid">

		<table id = "FormTable">
		 <tr id="FormRow">
		  <td id="FormTD">
		    <label for="group">Группа</label>
		  </td>
		  <td id="FormTD">	
		    <select name="group" id="group" size="1" class="FormElement ui-widget-content ui-corner-all"> </select>
		  </td>
		 </tr>

		 <tr id="FormRow">
		  <td id="FormTD">
		   <label for="location">Расположение</label>
		  </td>
		  <td id="FormTD">	
		   <input type="text" name="location" id="email" value="" class="FormElement ui-widget-content ui-corner-all" />
		  </td>
		 </tr>

		<tr id="FormRow">
		 <td id="FormTD">
		  <label for="file">Проект (.pdk)</label>
		 </td>
		 <td id="FormTD">	
		  <input type="file" name="file" id="file" value="" class="FormElement ui-widget-content ui-corner-all"/>
		 </td>
		</tr>

		</table>

		<input type="hidden" name="action" value="_add"/>
		<input type="hidden" name="c_id" value="-1" />
	</form>
</div>

<div id="main-box">
	<table id="list"></table> 
	<div id="button-box">	
		<button id="add-button">Новый</button>
		<button id="edit-button">Редактировать</button>	
		<button id="remove-button">Удалить</button>
	</div>
</div>

<div id="down-box">
	<table id="con-info-table" cellspacing="0">
	<tr><th id="first"></th><th id="loaded">Загружена</td><th>Активирована</th></tr>
		<tr><td id="head">Программа</td><td id="load-date"></td><td id="active-date"></td></tr>
		<tr><td id="head">Текущий ключ</td><td id="cur-key" colspan="2"></td></tr>
		<tr><td id="head">Ключ программы</td><td id="next-key" colspan="2"></td></tr>
		<tr><td id="head">Предыдущий ключ</td><td id="prev-key"colspan="2"></td></tr>
		<tr><td id="head">Статус контроллера</td><td id="con-state"colspan="2"></td></tr>
	</table>
	<input type="hidden" name="cont_id" value=""/>	
	<div id="con-rule-box">
		<button id="load-button">Загрузить программу</button>	
		<button id="set-phase-button">Активировать фазу</button>
		<button id="set-prog-button">Активировать программу</button>
		<button id="set-time-button">Установить время</button>
    </div>
</div>


</body>
</html>